#include "../../../libraries/sockets/udp_socket.h"
#include <iostream>
#include <fstream>
#include <string>
#include "../../../config.h"

#include <cstdlib>


using namespace std; 

int main(int argc, char *argv[])

{
    if (argc<2){
        cout <<"use this format: ./server portno" <<endl;
        exit(1);
    }

    UDP_socket serverUDP; //Creamos socket

    serverUDP.setPortno(atoi(argv[1])); //Asignamos puerto

    serverUDP.bind(); //Enlazamos

    string letra;

    srand(time(0)); //Así evitamos que rand tenga siempre la misma salida

    string palabra;
    string vers;

    ifstream myfile;

    serverUDP >> vers;

    serverUDP.setReceiverAdress();

    char version = vers[0];

    if((version=='E')||(version=='e'))
    {
        myfile.open(TXT_PATH"palabras.txt");
    }
    else if ((version=='I')||(version=='i'))
    {
        myfile.open(TXT_PATH"words.txt");
    }
    else
    {
        cout << "Opción errónea. Salga y vuelva a intentarlo." << endl;
    }


    if (myfile.is_open())
    {

        int error=0, cont=0, num_let=0; //contadores de errores y asteriscos
        char x; //letra posible

        string p_incog="*";
        string letras_incorr;

        //Cogemos una palabra al azar del archivo
        int randw = rand() % 30 + 1; //30=número de palabras en el txt

        for(int i=0; i<randw; i++)
        {
            getline (myfile,palabra);
        }

        //Llenamos con asteriscos palabra. Pista tamaño
        for (int i=0; i<palabra.size()-1; i++)
        {
            p_incog.append("*");
        }

        serverUDP << p_incog;


        //Comprobamos si la letra está en la palabra y sustituimos.
        do
        {
            int  exist=0;
            //¿Ha sustituido alguna? O la letra no pertenece?
            do
            {   num_let=0;
                cont=0;
                serverUDP << "- - - - - - - - - - - - - - - - - ";
                serverUDP << " No pertenecen: " << letras_incorr;
                serverUDP << "\n Letra?: ";

                serverUDP>>letra;
                x=letra[0];

                for (int i=0; i<palabra.size(); i++)
                {
                    if (palabra[i]==x) //Pertenece?
                    {
                        num_let++;
                        p_incog[i]=x;
                    }

                    if(p_incog[i] =='*') //Ha sustituido ya todas las letras?
                    {
                        cont++;
                    }
                }
                serverUDP <<p_incog;

            }while(num_let!=0&&cont!=0);//Si pertenece y no hemos ganado, seguimos pidiendo letras


            for(int j=0; j<letras_incorr.size();j++) //Evitar que salga error por letra no perteneciente ya introducida (OPCIONAL)
            {
                if(letras_incorr[j]==x)
                {
                    exist++;
                }
            }
            if ((cont!=0)&&(exist==0)) //No pertenece
            {
                serverUDP << " La letra no pertenece a la palabra\n" ;
                letras_incorr.append(&x);
                letras_incorr.append(" ");
                error++;
            }
            else if ((cont!=0)&&(exist!=0)) //No pertenece. Ya introducida.
            {
                serverUDP <<"\n ¡¡ LETRA YA INTRODUCIDA !!\n";
            }

            switch (error) //¿Cómo está nuestro hangman?
            {
            case 0:
                serverUDP <<"________\n|      |\n|\n|\n|\n|\n----- 0F\n";
                break;
            case 1:
                serverUDP <<"________\n|      |\n|      Q\n|\n|\n|\n----- 1F\n";
                break;
            case 2:
                serverUDP <<"________\n|      |\n|      Q\n|      |\n|\n|\n----- 2F\n";
                break;
            case 3:
                serverUDP <<"________\n|      |\n|      Q\n|     /|\n|\n|\n----- 3F\n";
                break;
            case 4:
                serverUDP <<"________\n|      |\n|      Q\n|     /|\\\n|\n|\n----- 4F\n";
                break;
            case 5:
                serverUDP <<"________\n|      |\n|      Q\n|     /|\\\n|     /\n|\n----- 5F\n";
                break;
            case 6:
                serverUDP <<"________\n|      |\n|      Q\n|     /|\\\n|     / \\\n|\n----- 6F\n";
                break;
            default:
                serverUDP << "Error\n";
                break;
            }
            serverUDP <<p_incog;

        }while ((cont!=0)&&(error<6));

        if(error==6)//Victoria
            serverUDP <<"\n GAME OVER     La palabra correcta era: " << palabra << "\n\n";

        if (cont==0)//Derrota
            serverUDP <<"\n :)  :) ¡¡FELICIDADES!! :)  :)\n\n";

        serverUDP << "FIN";
        myfile.close(); //Cerramos archivo
    }

    else cout << "Error al abrir el archivo." <<"\n"; //Fallo al abrir

    return 0;
}
